package com.ly.base.chapter03;

import java.util.Comparator;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * 去重与排序
 */
public class AISortDemo {
    public static void main(String[] args) {
        /**
         * 去重: distinct()
         */
//        IntStream.of(1,2,3,4,5,5,1,3,7)
//                .distinct()
//                .forEach(System.out::println);
        Stream.of(
                new Hero("令狐冲", 90),
                new Hero("风清扬", 98),
                new Hero("独孤求败", 100),
                new Hero("方证", 92),
                new Hero("东方不败", 98),
                new Hero("冲虚", 90),
                new Hero("向问天", 88),
                new Hero("任我行", 92),
                new Hero("不戒", 88),
                new Hero("不戒", 88)
        )
                .distinct()
                .forEach(System.out::println);
        System.out.println("===========================");
        /**
         * 排序:sorted(比较器)
         *      比较器逻辑：(a,b) -> int(返回值类型)
         *
         * 1、Comparator.comparing(需要比较的属性) // 升序比较器
         * 2、reversed() // 倒序
         * 3、thenComparing(比较逻辑) // 在Comparator.comparing(...)后使用，当比较值相等时，继续按后逻辑比较
         */
        Stream.of(
                new Hero("令狐冲", 90),
                new Hero("风清扬", 98),
                new Hero("独孤求败", 100),
                new Hero("方证", 92),
                new Hero("东方不败", 98),
                new Hero("冲虚", 90),
                new Hero("向问天", 88),
                new Hero("任我行", 92),
                new Hero("不戒", 88)
        )
//                .sorted((a,b) -> a.strength() < b.strength() ? -1 : a.strength() == b.strength() ? 0 : 1)
//                .sorted((a,b) -> Integer.compare(a.strength(), b.strength()))
//                .sorted(Comparator.comparing(h -> h.strength()))
//                .sorted(Comparator.comparing(Hero::strength)) // 武力值升序
//                .sorted(Comparator.comparing(Hero::strength).reversed()) // 武力值降序
                .sorted(Comparator.comparing(Hero::strength).reversed().thenComparing(l -> l.name().length())) // 武力值降序,武力值相等，名字长度升序

                .forEach(System.out::println);


    }


    //数据类
    record Hero(String name, int strength) { }
}
